﻿using System;
using System.Linq;
using fb.messages.contracts;
using NUnit.Framework;

namespace fb.befragung.tests
{
  [TestFixture]
  public class Test_InputPins_TracerBullet
  {
    private FragebogenMock fragebogenMock;

    [SetUp]
    public void Setup()
    {
      var antwortMöglichkeitenMockA = new[]
                                    { new AntwortmöglichkeitMock("Antwort A1", 1, 0)
                                    , new AntwortmöglichkeitMock("Antwort A2", 2, 1)
                                    , new AntwortmöglichkeitMock("Antwort A3", 3, 2)
                                    , new AntwortmöglichkeitMock("Antwort A4", 4, 3)
                                    };

      var fragenMockA = new[]
                      {
                        new FrageMock("Frage A", antwortMöglichkeitenMockA)
                      };

      var gruppenMockA = new[]
                      {
                        new GruppeMock("Gruppe A", fragenMockA)
                      };

      this.fragebogenMock = new FragebogenMock(gruppenMockA);
    }

    [Test]
    public void InFragebogen_Erste_BefragungsViewDataGruppe_wird_vom_Fragebogen_extrahiert()
    {
      var befragungsGruppeViewDataResult = (IBefragungsGruppeViewData)null;

      var sut = new Befragung
                  {
                    Out_ViewDerAktuellenBefragungsGruppe = befragungsGruppeViewData => befragungsGruppeViewDataResult = befragungsGruppeViewData
                  };

      sut.In_Fragebogen(this.fragebogenMock);

      Assert.NotNull(befragungsGruppeViewDataResult);
      Assert.That(befragungsGruppeViewDataResult.GruppenIndex, Is.EqualTo(0));

      Assert.That(befragungsGruppeViewDataResult.AnzahlGruppen, Is.EqualTo(1));

      Assert.That(befragungsGruppeViewDataResult.Name, Is.EqualTo("Gruppe A"));
      Assert.That(befragungsGruppeViewDataResult.GruppeBeantwortet, Is.EqualTo(true));


      Assert.That(befragungsGruppeViewDataResult.Fragen.Count(), Is.EqualTo(1));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Text, Is.EqualTo("Frage A"));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.Count(), Is.EqualTo(4));

      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(0).Text, Is.EqualTo("Antwort A1"));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(0).Id, Is.EqualTo(0));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(0).IstGewählt, Is.EqualTo(false));

      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(1).Text, Is.EqualTo("Antwort A2"));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(1).Id, Is.EqualTo(1));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(1).IstGewählt, Is.EqualTo(false));

      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(2).Text, Is.EqualTo("Antwort A3"));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(2).Id, Is.EqualTo(2));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(2).IstGewählt, Is.EqualTo(false));

      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(3).Text, Is.EqualTo("Antwort A4"));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(3).Id, Is.EqualTo(3));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(3).IstGewählt, Is.EqualTo(false));

    }
    
    [Test]
    public void InAntwortGegeben_Erste_BefragungsViewDataGruppe_wird_vom_Fragebogen_extrahiert_und_Antwortmöglichkeit_wird_selektiert()
    {
      var befragungsGruppeViewDataResult = (IBefragungsGruppeViewData)null;

      var sut = new Befragung(this.fragebogenMock)
                  {
                    Out_ViewDerAktuellenBefragungsGruppe = befragungsGruppeViewData => befragungsGruppeViewDataResult = befragungsGruppeViewData
                  };
      sut.In_AntwortGegeben(2);

      Assert.NotNull(befragungsGruppeViewDataResult);

      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(0).IstGewählt, Is.EqualTo(false));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(1).IstGewählt, Is.EqualTo(false));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(2).IstGewählt, Is.EqualTo(true));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(3).IstGewählt, Is.EqualTo(false));
      
      sut.In_AntwortGegeben(1);

      Assert.NotNull(befragungsGruppeViewDataResult);

      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(0).IstGewählt, Is.EqualTo(false));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(1).IstGewählt, Is.EqualTo(true));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(2).IstGewählt, Is.EqualTo(false));
      Assert.That(befragungsGruppeViewDataResult.Fragen.ElementAt(0).Antwortmöglichkeiten.ElementAt(3).IstGewählt, Is.EqualTo(false));
    }


    [Test]
    public void InGruppenAnfrage_Nur_erste_BefragungsViewDataGruppe_wird_vom_Fragebogen_extrahiert_und_GruppenIndex_wird_ignoriert()
    {
      var befragungsGruppeViewDataResult = (IBefragungsGruppeViewData)null;

      var sut = new Befragung(this.fragebogenMock)
                  {
                    Out_ViewDerAktuellenBefragungsGruppe = befragungsGruppeViewData => befragungsGruppeViewDataResult = befragungsGruppeViewData
                  };
      sut.In_GruppenAnfrage(2);

      Assert.NotNull(befragungsGruppeViewDataResult);

      Assert.That(befragungsGruppeViewDataResult.GruppenIndex, Is.EqualTo(0));
    }

    [Test, ExpectedException(typeof(NotImplementedException))]
    public void In_AuswertungsAnfrage_Es_passiert_nichts()
    {
      var sut = new Befragung(this.fragebogenMock);

      sut.In_AuswertungsAnfrage();

    }

  }
}
